﻿using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//using System.Configuration;
//using HarmonyLib;
using TaleWorlds.Core;
using TaleWorlds.MountAndBlade;
using TaleWorlds.CampaignSystem;
//using TaleWorlds.CampaignSystem.Actions;
using TaleWorlds.CampaignSystem.GameMenus;
//using TaleWorlds.CampaignSystem.Overlay;
//using TaleWorlds.CampaignSystem.SandBox.CampaignBehaviors;
//using TaleWorlds.CampaignSystem.SandBox.GameComponents;
//using TaleWorlds.CampaignSystem.SandBox.GameComponents.Party;
//using TaleWorlds.Localization;
//using TaleWorlds.SaveSystem;
//using TaleWorlds.Library;
using TaleWorlds.ObjectSystem; // 1.3

namespace VsMod_RoyalArmoury
{
    public class VsMod_RoyalArmoury_SubModule : MBSubModuleBase
    {
        protected override void OnSubModuleLoad()
        {
            base.OnSubModuleLoad();
        }

        protected override void OnBeforeInitialModuleScreenSetAsRoot()
        {
            base.OnBeforeInitialModuleScreenSetAsRoot();
            InformationManager.DisplayMessage(new InformationMessage("Vaeringjar's Faction Armouries [v1.0]"));
        }

        protected override void OnGameStart(Game game, IGameStarter gameStarterObject)
        {
            if (!(game.GameType is Campaign))
                return;
            CampaignGameStarter gameInitializer = (CampaignGameStarter)gameStarterObject;

            gameInitializer.AddBehavior(new VsMod_RoyalArmoury_Behaviour());
        }
    }

    public class VsMod_RoyalArmoury_Behaviour : CampaignBehaviorBase
    {
        private void OnSessionLaunched(CampaignGameStarter campaignGameStarter)
        {
            campaignGameStarter.AddGameMenuOption("town_keep", "armoury", "Access the Armoury", vs_generic_access_on_condition, vs_armoury_on_consequence, false, 99, false);
            campaignGameStarter.AddGameMenuOption("town_keep", "armoury", "Access the Royal Armoury", vs_royal_access_on_condition, vs_armoury_on_consequence, false, 99, false);
            campaignGameStarter.AddGameMenuOption("town_keep", "armoury", "Access the Imperial Armoury", vs_imperial_access_on_condition, vs_armoury_on_consequence, false, 99, false);
            campaignGameStarter.AddGameMenuOption("town_keep", "armoury", "Access the Khanate Armoury", vs_khanate_access_on_condition, vs_armoury_on_consequence, false, 99, false);
            campaignGameStarter.AddGameMenuOption("town_keep", "armoury", "Access the Confederal Armoury", vs_aserai_access_on_condition, vs_armoury_on_consequence, false, 99, false);
            campaignGameStarter.AddGameMenuOption("town_keep", "armoury", "Access the High Clan's Armoury", vs_battania_access_on_condition, vs_armoury_on_consequence, false, 99, false);
            campaignGameStarter.AddGameMenuOption("town_keep", "armoury", "Access the Princely Armoury", vs_sturgia_access_on_condition, vs_armoury_on_consequence, false, 99, false);
            //campaignGameStarter.AddGameMenuOption("town", "placeholder", "get the stringgggggs", null, vs_test_on_consequence, false, 99, false);
        }
        //private void vs_test_on_consequence(MenuCallbackArgs args) { InformationManager.DisplayMessage(new InformationMessage("Settlement culture StringID: " + Settlement.CurrentSettlement.Culture.StringId)); }

        // royal/imperial armoury
        // TODO // if vassal, require influence to access; if mercenary, require gold; if neither, no access
        private bool vs_generic_access_on_condition(MenuCallbackArgs args) // fallback for mod-added cultures
        {
            args.optionLeaveType = GameMenuOption.LeaveType.Trade;
            //string culture = Settlement.CurrentSettlement.Culture.StringId;
            //string culture = Settlement.CurrentSettlement.OwnerClan.Culture.StringId;
            string culture = Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId;
            if (culture == "battania" || culture == "aserai" || culture == "sturgia" || culture == "vlandia" || culture == "empire" || culture == "khuzait")
                return false;
            else return true;
        }
        private bool vs_royal_access_on_condition(MenuCallbackArgs args)
        {
            args.optionLeaveType = GameMenuOption.LeaveType.Trade;
            if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "vlandia")
                return true;
            else return false;
        }
        private bool vs_imperial_access_on_condition(MenuCallbackArgs args)
        {
            args.optionLeaveType = GameMenuOption.LeaveType.Trade;
            if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "empire")
                return true;
            else return false;
        }
        private bool vs_khanate_access_on_condition(MenuCallbackArgs args)
        {
            args.optionLeaveType = GameMenuOption.LeaveType.Trade;
            if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "khuzait")
                return true;
            else return false;
        }
        private bool vs_aserai_access_on_condition(MenuCallbackArgs args)
        {
            args.optionLeaveType = GameMenuOption.LeaveType.Trade;
            if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "aserai")
                return true;
            else return false;
        }
        private bool vs_battania_access_on_condition(MenuCallbackArgs args)
        {
            args.optionLeaveType = GameMenuOption.LeaveType.Trade;
            if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "battania")
                return true;
            else return false;
        }
        private bool vs_sturgia_access_on_condition(MenuCallbackArgs args)
        {
            args.optionLeaveType = GameMenuOption.LeaveType.Trade;
            if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "sturgia")
                return true;
            else return false;
        }

        private void vs_armoury_on_consequence(MenuCallbackArgs args)
        {
            ItemRoster armoury = new ItemRoster();

            if (Settlement.CurrentSettlement.Culture.StringId == "aserai")
            {
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("southern_noble_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("southern_lord_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("aserai_lord_helmet_a"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("desert_scale_shoulders"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("leopard_pelt"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("desert_scale_armor"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgia_cavalry_armor"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("desert_lamellar"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("stitched_leather_over_mail"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("mail_and_plate_barding"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("half_mail_and_plate_barding"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("eastern_javelin_3_t4"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("steel_round_shield"), 10);
            }
            if (Settlement.CurrentSettlement.Culture.StringId == "battania")
            {
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battanian_crowned_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battanian_plated_noble_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battanian_noble_helmet_with_feather"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_warlord_pauldrons"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("armored_bearskin"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("bearskin"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("rough_bearskin"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_warlord_armor"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_mercenary_armor"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("kilt_over_plated_leather"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_warlord_bracers"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_noble_bracers"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_warlord_boots"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_horse_harness_scaled"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("battania_horse_harness_halfscaled"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("bodkin_arrows_a"), 10);
            }
            if (Settlement.CurrentSettlement.Culture.StringId == "empire")
            {
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("empire_guarded_lord_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("empire_jewelled_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("empire_lord_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("empire_helmet_with_metal_strips"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("imperial_goggled_helmet"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("imperial_lamellar_shoulders"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("pauldron_cape_a"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("studded_imperial_neckguard"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("imperial_scale_armor"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lamellar_with_scale_skirt"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("imperial_lamellar"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("legionary_mail"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lamellar_plate_gauntlets"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("decorated_imperial_gauntlets"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lordly_padded_mitten"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lamellar_plate_boots"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("decorated_imperial_boots"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("half_scale_barding"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("imperial_scale_barding"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("arrow_emp_1_a"), 10);
            }
            if (Settlement.CurrentSettlement.Culture.StringId == "khuzait")
            {
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("khuzait_noble_helmet_with_neckguard"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("spiked_helmet_with_facemask"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("khuzait_noble_helmet_with_fur"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("eastern_vendel_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("khuzait_noble_helmet_with_feathers"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("brass_lamellar_shoulder"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lamellar_shoulders"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("brass_lamellar_over_mail"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("eastern_plated_leather"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("eastern_plated_leather_vambraces"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("studded_steppe_barding"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("steppe_half_barding"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("heavy_steppe_arrows"), 10);
            }
            if (Settlement.CurrentSettlement.Culture.StringId == "sturgia")
            {
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgian_lord_helmet_c"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lendman_helmet_over_full_mail"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lendman_helmet_over_mail"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("northern_warlord_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgian_lord_helmet_b"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgian_helmet_b_close"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgian_lord_helmet_a"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("imperial_goggled_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("decorated_goggled_helmet"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("brass_lamellar_shoulder_white"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("brass_scale_shoulders"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("armored_bearskin"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("bearskin"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("rough_bearskin"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgian_fortified_armor"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgian_lamellar_base"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("sturgian_lamellar_fortified"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("northern_coat_of_plates"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("northern_brass_lamellar_over_mail"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("northern_plated_gloves"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("northern_plated_boots"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("northern_ring_barding"), 10);
            }
            if (Settlement.CurrentSettlement.Culture.StringId == "vlandia")
            {
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("western_crowned_plated_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("western_crowned_helmet"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("full_helm_over_mail_coif"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("western_plated_helmet"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("mail_shoulders"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("coat_of_plates_over_mail"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("plated_leather_coat"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lordly_mail_mitten"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("reinforced_mail_mitten"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("lordly_padded_mitten"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("strapped_mail_chausses"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("mail_chausses"), 10);

                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("chain_barding"), 10);
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("halfchain_barding"), 10);
            }

            if (Game.Current.CheatMode)
            {
                armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("dummy_armor_max"), 10); 
                if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "empire")
                {
                    armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("empire_crown"), 10);
                }
                if (Settlement.CurrentSettlement.OwnerClan.Kingdom.Culture.StringId == "vlandia")
                {
                    armoury.AddToCounts(MBObjectManager.Instance.GetObject<ItemObject>("butter"), 666);
                }
            }

            InventoryManager.OpenScreenAsTrade(armoury, Settlement.CurrentSettlement.Town);
        }

        public override void RegisterEvents()
        {
            CampaignEvents.OnSessionLaunchedEvent.AddNonSerializedListener(this, new Action<CampaignGameStarter>(this.OnSessionLaunched));
        }
        public override void SyncData(IDataStore dataStore)
        {
        }
    }
}
